/**
 * JFClientConnecte.java    23/03/2012
 */

package l3.info.Projet.Client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

import l3.info.Projet.Client.JDAPropos;
import l3.info.Projet.Client.JDAjoutSuivi;
import l3.info.Projet.Client.JFAuthentification;

/**
 * Représente la JFrame lorsque l'utilisateur
 * est connecté
 * @author Loïc Martinez
 * @version 1.0
 */

public class JFClientConnecte extends JFrame implements ActionListener, 
MouseListener {

	private static final String TITRE = "MessageFolder";
	private static final String user = "default user";
	private static final String DCNX = "Déconnexion";
	private static final String QUITTER = "Quitter";
	private static final String AJOUT = "Ajout suivi";
	private static final String FICHIER = "Fichier";
	private static final String AIDE = "Aide";
	private static final String APROPOS = "A propos...";
	private static final String UTILISATEURS_SUIVIS = "Utilisateurs suivis";
	private static final String MSG_ECRIT_PAR = "Messages écrits par ";
	private static final int LARGEUR_PAN_BOUTON = 50;
	private static final int HAUTEUR_PAN_BOUTON = 100;
	
	private final static int ABSCISSE = 250;
	private final static int ORDONNEE = 100;
	private final static int  LARGEUR = 685;
	private final static int HAUTEUR = 565;
	
	private final Dimension SCROLL_SIZE = new Dimension(140, 410);
	private final Dimension DIMENSION_PG = new Dimension(140, 400);
	private final Dimension MIN_DIMENSION_PANEL = new Dimension(343, 600);
	private final Color BACKGROUND_COLOR = new Color(255, 255, 255);
	
	// ---------------------- Juste un test, à virer ! -------------------- //
	private final static String me = "moi";
	private final static int idMe = 1234;
	// -------------------------------------------------------------------- //
	
	/** Les JPanel de gauche et de droite */
	private JPanel panelGauche;
	private JPanel panelDroite;

	/** splitPane pour séparer la droite et la gauche,
	 *  splitPane2 pour avoir une partie en bas (panelBouton)
	 */
	private JSplitPane splitPane,splitPane2;

	/** Le JPanel pour les boutons (en bas de la fenêtre) */
	private JPanel panelBouton;

	/** Les 3 boutons de la JFrame */
	private JButton boutonEcrire, boutonAjouter, boutonSupprimer;

	/** La liste des personnes suivies */
	private JList list;

	/** Permet d'avoir une barre de scrolling verticale
	 *  pour les personnes suivies et les messages de la personne
	 */
	private JScrollPane scroll, scrollArea;

	/** Pour l'affichage des messages */
	private JTextArea area;

	/** Pour pouvoir modifier la liste des utilisateurs */
	private DefaultListModel model;

	/** La barre Fichier etc. */
	private JMenuBar menuBar;

	/** Les différents menus (Fichier, Aide etc.) */
	private JMenu menuFichier;
	private JMenu menuAide;
	private JMenuItem menuAjoutSuivi;
	private JMenuItem menuDeconnexion;
	private JMenuItem menuQuitter;
	private JMenuItem menuAPropos;

	/** Menu pour chaque élément de la liste */
	private JPopupMenu menuList;
	private JMenuItem menuListItem;
	
	/**
	 * Constructeur par défaut
	 */
	public JFClientConnecte() {
		setProperties();
	}

	/**
	 * Applique les propriétés pour la JFrame dont on hérite
	 */
	public void setProperties() {		
		// TODO : Modifier pour aller chercher les utilisateurs suivis
		// et afficher leur pseudo avec la méthode fillJList
		// et effacer le tableau t avec les constantes
		setTitle(TITRE);
		setBounds(ABSCISSE, ORDONNEE, LARGEUR, HAUTEUR);
		setResizable(false);
		getContentPane().setLayout(new BorderLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		fillJList();
		setComponents();
		setVisible(true);
	}

	/**
	 * Ajoute le menu Fichier, Options, Aide...
	 */
	private void addMenuBar() {
		menuBar = new JMenuBar();
		menuFichier = new JMenu(FICHIER);
		menuBar.add(menuFichier);

		menuAide = new JMenu(AIDE);
		menuBar.add(menuAide);

		setJMenuBar(menuBar);

		menuAjoutSuivi = new JMenuItem(AJOUT);
		menuFichier.add(menuAjoutSuivi);
		menuAjoutSuivi.addActionListener(this);

		menuDeconnexion = new JMenuItem(DCNX);
		menuFichier.add(menuDeconnexion);
		menuDeconnexion.addActionListener(this);

		menuQuitter = new JMenuItem(QUITTER);
		menuFichier.add(menuQuitter);
		menuQuitter.addActionListener(this);

		menuAPropos = new JMenuItem(APROPOS);
		menuAide.add(menuAPropos);
		menuAPropos.addActionListener(this);
	}

	/**
	 * Place les composants dans la JFrame
	 */
	public void setComponents() {
		// On ajoute la barre de menus
		addMenuBar();
		
		// On créé et modifie le panel de gauche (utilisateurs)
		panelGauche = new JPanel(new FlowLayout());
		panelGauche.setBackground(BACKGROUND_COLOR);
		panelGauche.setLayout(new FlowLayout(FlowLayout.CENTER));

		panelGauche.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createTitledBorder(UTILISATEURS_SUIVIS),
				BorderFactory.createEmptyBorder(10, 10, 10, 10)));
		
		panelGauche.setPreferredSize(DIMENSION_PG);
		
		// On créé et modifie le panel de droite (messages)		
		panelDroite = new JPanel(new FlowLayout());
		
		panelDroite.setLayout(new BoxLayout(panelDroite, BoxLayout.Y_AXIS));
		panelDroite.setBorder(BorderFactory.createCompoundBorder
				(BorderFactory.createTitledBorder
						(MSG_ECRIT_PAR + user),
						BorderFactory.createEmptyBorder(1,1,1,1)));
		
		panelDroite.setBackground(BACKGROUND_COLOR);

		// Permet de ne pas pouvoir redimensionner les splitPane
		panelDroite.setMinimumSize(new Dimension(MIN_DIMENSION_PANEL));
		panelGauche.setMinimumSize(new Dimension(MIN_DIMENSION_PANEL));

		// Contiendra les messages
		area = new JTextArea();
		
		// On ne peut pas modifier le texte dedans
		area.setEditable(false);

		// On y ajoute la barre de scrolling
		scrollArea = new JScrollPane(area);
		scrollArea.setVerticalScrollBarPolicy(
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

		panelDroite.add(scrollArea);

		// On initialise la JList avec la liste des utilisateurs
		list = new JList(model);
		
		// On ne peut sélectionner qu'un seul pseudo à la fois
		list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
		list.setFixedCellHeight(27);
		DefaultListCellRenderer centerRenderer = new DefaultListCellRenderer();
		centerRenderer.setHorizontalAlignment(JLabel.CENTER);
		list.setCellRenderer(centerRenderer);
		list.addMouseListener(this);

		// On y ajoute aussi la barre de scrolling
		scroll = new JScrollPane(list);
		scroll.setPreferredSize(SCROLL_SIZE);
		scroll.setHorizontalScrollBarPolicy(
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

		// On ajoute le scroll au panel gauche
		panelGauche.add(scroll);

		// Le splitPane avec une separation horizontale (barre à la verticale)
		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelGauche, 
				panelDroite);
		
		// Place la barre de séparation a 200 px
		splitPane.setDividerLocation(150);

		// On ajoute les différents boutons
		panelBouton = new JPanel(new BorderLayout());
		panelBouton.setLayout(null);
		panelBouton.setSize(LARGEUR_PAN_BOUTON, HAUTEUR_PAN_BOUTON);

		boutonEcrire = new JButton ("Ecrire");
		boutonEcrire.setBounds(390, 15, 90, 25);
		panelBouton.add(boutonEcrire);

		boutonAjouter = new JButton ("Ajouter");
		boutonAjouter.setBounds(485, 15, 90, 25);
		boutonAjouter.addActionListener(this);

		panelBouton.add(boutonAjouter);
		boutonEcrire.addActionListener(this);

		// Utilisation d'une balise html car texte trop long dans
		// le JButton
		boutonSupprimer = new JButton ("<html>Supprimer</html>");
		boutonSupprimer.setBounds(580, 15, 90, 25);
		boutonSupprimer.setEnabled(false);
		panelBouton.add(boutonSupprimer);
		
		// On cache le bouton écrire car aucune
		// personne n'est sélectionnée
		boutonEcrire.setEnabled(false);
		
		// Ajout du popupMenu à chaque élément de la Jlist
		// pour pouvoir supprimer l'utilisateur sélectionné
		menuList = new JPopupMenu();
		menuListItem = new JMenuItem("Supprimer");
		menuListItem.addActionListener(this);
		menuList.add(menuListItem);
		scroll.setComponentPopupMenu(menuList);
		
		// On ajoute le panneau final qui contient tous les autres 
		splitPane2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, splitPane, 
				panelBouton);
		splitPane2.setDividerLocation(455);

		add(splitPane2);
	}

	/**
	 * TODO : Ecrire la méthode
	 */
	public void fillJList() {
		model = new DefaultListModel();
		///////////////////////
		model.addElement(me);
		///////////////////////
		for (int i = 0; i < 100; i++) {
			model.addElement("User" + (i +1));
		}
	}

	/**
	 * Permet d'afficher les messages de l'utilisateur
	 * TODO : Ecrire en allant chercher les messages
	 *        dans la base de données
	 */
	public void afficheMessages() {
		String t = "";
		for (int i = 100; i > 0; i--) {
			t += list.getSelectedValue() + " : Message " + i + "\n";

			for (int j = 0; j < 25; j++) {
				t += "=";
			}

			t += i == 1 ? "" : "\n";
		}
		area.setText(t);

		area.setCaretPosition(0);
	}

	/**
	 * Lorsqu'un évènement est déclenché
	 */
	public void actionPerformed(ActionEvent ev) {
		// Appui sur déconnexion
		if (ev.getSource() == menuDeconnexion) {
			// Enlever l'utilisateur connecté grâce au booléen,
			// etc (passer le user à null ?)
			new JFAuthentification();
			dispose();
		} else if (ev.getSource() == menuAjoutSuivi) {
			int idAjout = new JDAjoutSuivi().getId();
			// Ajout de l'utilisateur, si déjà suivi ou
			// n'existe pas, afficher une JDialog d'erreur
		} else if (ev.getSource() == menuQuitter) {
			// Enlever l'utilisateur connecté grâce au booléen, etc
			dispose();
		} else if (ev.getSource() == menuAPropos) {
			new JDAPropos("Loïc Martinez");
		} else if (ev.getSource() == boutonAjouter) {
			int idAjout = new JDAjoutSuivi().getId();
			// Ajout de l'utilisateur, si déjà suivi ou
			// n'existe pas, afficher une JDialog d'erreur
		} else if (ev.getSource() == boutonEcrire) {
			// On récupère le texte écrit
			String texte;
			JDEcrireMessage jdMess = new JDEcrireMessage();
			if (jdMess.isEnvoye()) {
				texte = jdMess.getText();
				// Si le texte est non-vide, on fait le INSERT INTO dans la
				// base de données
				if (! texte.equals("")) {
					// Et on réactualise la liste des messages de l'utilisateur
					// dans l'interface graphique
				}
			}
		}
	}

	/**
	 * Quand on clique sur un utilisateur
	 */
	@Override
	public void mouseClicked(MouseEvent ev) {
		
		// Si sélection d'un élément de la JList
		// avec un clic droit
		// Problème !!! Le JPopupMenu ne suit pas le scroll !!
		if (ev.getButton() == 3) {
			int index = list.locationToIndex(ev.getPoint());
			list.setSelectedIndex(index);
			menuList.show(scroll, ev.getX(), ev.getY());
			if (list.getSelectedValue().toString().equals(me)) {
				menuListItem.setEnabled(false);
			} else {
				menuListItem.setEnabled(true);
			}
		}
		
		// Appui sur un pseudo, aller chercher tous les messages
		// qui ont été écrits
		//System.out.println(list.getSelectedValue());
		afficheMessages();
		
		if (list.getSelectedValue().toString().equals(me)) {
			boutonSupprimer.setEnabled(false);
			boutonEcrire.setEnabled(true);
		} else {
			boutonSupprimer.setEnabled(true);
			boutonEcrire.setEnabled(false);
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {

	}

	@Override
	public void mouseExited(MouseEvent arg0) {

	}

	@Override
	public void mousePressed(MouseEvent arg0) {

	}

	@Override
	public void mouseReleased(MouseEvent arg0) {

	}
	
	public static void main(String[] args) {
		new JFClientConnecte();
	}
}